package cn.fz.jpademo01.repo;

import cn.fz.jpademo01.domain.entity.SysUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.util.Optional;

/**
 * 用户表Repository
 *
 * 定义Repository接口
 * JPA中的Repository可以理解为DAO（Data Access Object），即数据操纵对象。一个JPA的实体类需要有一个对应的Repository，用于操作该实体类所映射的数据库表。Repository可以仅仅是一个接口无需创建它的实现类，需要继承JpaRepository<T, ID>接口，T是实体类，ID是实体类中@Id修饰的属性的类型。程序启动时Spring Data JPA会自动生成该接口的实现，并注册为Spring Bean。
 *
 * JpaRepository中定义了一系列最基本的CURD方法，开发者可以直接使用，也可以根据业务需求自定义查询方法。Spring Data JPA支持多种查询定义方式，主要包括：
 *
 * 基于方法名创建查询，可以根据方法名中的关键词构造出实际的查询SQL，在附录中给出了Spring Data JPA所支持的关键词；
 * 基于@Query注解创建JPQL查询或者原生SQL查询，nativeQuery属性设置为true时表示使用原生SQL；
 * 基于Specification构造动态查询，此方式需要Repository继承JpaSpecificationExecutor<T>接口,T是实体类；
 * 以下代码是使用不同方法创建查询的示例，基于Specification的查询方式在下一章节中给出。
 */
public interface SysUserRepository extends JpaRepository<SysUser,Long>, JpaSpecificationExecutor<SysUser> {
    /**
     * 根据username精确查询
     */
    Optional<SysUser> findByUsername(String username);

    // @Query("select u from SysUser u where u.username=?1")
    // Optional<SysUser> findByUsername2(String username);
}
